package org.ekingstar.qd.service.impl;

import java.util.List;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.ekingstar.qd.domain.QdColumnInfo;
import org.ekingstar.qd.domain.QdDest;
import org.ekingstar.qd.domain.QdDomain;
import org.ekingstar.qd.domain.QdDomainDest;
import org.ekingstar.qd.domain.QdDomainDestId;
import org.ekingstar.qd.service.CDestService;

public class CDestServiceImpl implements CDestService {
	private HibernateTemplate hibernateTemplate;
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
	
	@SuppressWarnings("unused")
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	/**
	 * @descripte 根据主题ID号，获取主题配置的表信息 
	 * @param strDomainId 主题ID号
	 * @return List
	 */
	@SuppressWarnings("unchecked")
	public List<QdDest> getTableList(String strDomainId){
		List<QdDest> retList = null;
		if(strDomainId!=null && !"".equals(strDomainId)){
			String hql = "select qdDomainDest.id.TQdDest from QdDomainDest qdDomainDest where qdDomainDest.id.TQdDomain.id='"+strDomainId+"'";
			retList = hibernateTemplate.find(hql);
		}
		return retList;
	}
	
	
	/**
	 * @descripte 增加主题表关联，成功返回1，否则返回-1
	 * @param strDomainId 主题ID号
	 * @param strTableId  表ID号集
	 * @return int
	 */
	public int addTableRelation(String strDomainId, String[] strTableId){
		int retInt = -1;
		try{
			if(strDomainId!=null && !"".equals(strDomainId) && strTableId!=null && strTableId.length>0){
				for(int i=0;i<strTableId.length;i++){
					if(strTableId[i]!=null && !"".equals(strTableId[i].toString().trim())){
						if(!isExistsRelation(strDomainId,strTableId[i].toString().trim())){
							QdDomainDest qdDomainDest = new QdDomainDest();
							
							QdDomainDestId qdDomainDestId = new QdDomainDestId();
							
							QdDest qdDest = new QdDest();
							qdDest.setId(strTableId[i].toString().trim());
							qdDomainDestId.setTQdDest(qdDest);
							
							QdDomain qdDomain = new QdDomain();
							qdDomain.setId(strDomainId);
							qdDomainDestId.setTQdDomain(qdDomain);
							
							qdDomainDest.setId(qdDomainDestId);
							
							hibernateTemplate.save(qdDomainDest);
						}
					}
				}
				retInt = 1;
			}
		}catch(Exception e){
			e.printStackTrace();
			retInt = -1;
		}
		
		return retInt;
	}
	
	
	/**
	 * @descripte 判断给定的主题和表关系是否已经存在，存在返回true，否则返回false
	 * @param strDomainId 主题ID号
	 * @param strTableId  表ID号
	 * @return boolean
	 */
	@SuppressWarnings("unchecked")
	private  boolean isExistsRelation(String strDomainId, String strTableId){
		boolean retBoolean = false;
		try{
			if(strDomainId!=null && !"".equals(strDomainId) && strTableId!=null && !"".equals(strTableId)){
				String hql = " from QdDomainDest qdDomainDest where qdDomainDest.id.TQdDest.id='"+strDomainId+"' and qdDomainDest.id.TQdDomain.id='"+strTableId+"'";
				List l = hibernateTemplate.find(hql);
				if(l!=null && l.size()>0){
					retBoolean = true;
				}
			}
		}catch(Exception e){
			e.printStackTrace();
			retBoolean = false;
		}
		
		return retBoolean;
	}
	

	
	/**
	 * @descripte 根据表名称或者是表中文名称查询表信息
	 * @param strKeyWord 表名称或表中文名称
	 * @return List
	 */
	@SuppressWarnings({ "unchecked", "unchecked" })
	public List<QdDest> getTableListByKeyWord(String strKeyWord){
		List<QdDest> retList = null;
		String hql = " from QdDest qdDest  ";
		if(strKeyWord!=null && !"".equals(strKeyWord.toString().trim())){
			hql += "where qdDest.name like ? or qdDest.cname like ? ";
			Object[] parameters = { "%" + strKeyWord + "%", "%" + strKeyWord + "%" };
			retList = hibernateTemplate.find(hql, parameters);
		}else{
			retList = hibernateTemplate.find(hql);
		}
		
		return retList;
	}
		

	/**
	 * @descripte 根据表ID号获取表信息
	 * @param strTableId  表ID号
	 * @return QdDest
	 */
	public QdDest getTable(String strTableId){
		QdDest qdDest = null;
		if(strTableId!=null && !"".equals(strTableId)){
			qdDest = (QdDest)hibernateTemplate.get(QdDest.class, strTableId);
		}
		return qdDest;
	}
	
		
	/**
	 * @descripte 更新字典库，成功返回1，否则返回-1	 
	 * @return int
	 */
	public int refreTableAndField(){
		return 0;
	}
	
	
	/**
	 * @descripte 删除主题表关联信息，成功返回1，否则返回-1	 
	 * @param strDomainId 主题ID号
	 * @param strTableId  表ID号集
	 * @return int
	 */
	@SuppressWarnings("unchecked")
	public int delTableRelation(String strDomainId, String[] strTableId){
		int retInt = -1;
		try{
			if(strDomainId!=null && !"".equals(strDomainId) && strTableId!=null && strTableId.length>0){
				for(int i = 0;i<strTableId.length;i++){
					if(strTableId[i]!=null && !"".equals(strTableId[i].toString().trim())){
						String hql = " from QdDomainDest qdDomainDest where qdDomainDest.id.TQdDest.id = '"+strTableId[i].toString().trim()+"' and qdDomainDest.id.TQdDomain.id = '"+strDomainId+"'";
						List<QdDomainDest> l = hibernateTemplate.find(hql);
						if(l!=null && l.size()>0){
							QdDomainDest qdDomainDest = (QdDomainDest)l.get(0);
							hibernateTemplate.delete(qdDomainDest);
						}
					}
				}
				retInt = 1;
			}
			
		}catch(Exception e){
			e.printStackTrace();
			retInt = -1; 
		}
		return retInt;
	}
	
	/**
	 * @descripte 根据表ID号获取对应的表字段信息
	 * @param strTableId 表ID号
	 * @return List
	 */
	@SuppressWarnings("unchecked")
	public List<QdColumnInfo> getFieldList(String strTableId){
		List<QdColumnInfo> retList = null;
		try{
			if(strTableId!=null && !"".equals(strTableId)){
				String hql = " from QdColumnInfo  qdColumnInfo where qdColumnInfo.TQdDest.id = '"+strTableId+"'";
				retList = hibernateTemplate.find(hql);
			}
		}catch(Exception e){
			e.printStackTrace();
			retList = null;
		}
		
		return retList;
	}
	
	
	/**
	 * @descripte 根据字段ID号获取字段信息
	 * @param strFieldId  字段ID号
	 * @return QdColumnInfo
	 */
	public QdColumnInfo getField(String strFieldId){
		QdColumnInfo qdColumnInfo = null;
		try{
			if(strFieldId!=null && !"".equals(strFieldId)){
				qdColumnInfo = (QdColumnInfo)hibernateTemplate.get(QdColumnInfo.class, strFieldId);
			}
		}catch(Exception e){
			e.printStackTrace();			
		}
		return qdColumnInfo;
	}

}
